package juc_synchronized;

import java.util.concurrent.CountDownLatch;

/**
 * ClassName: CountDownLatchTest
 * Package: juc_synchronized
 *
 * @Author 马学兴
 * @Create 2024/3/17 14:47
 * @Version 1.0
 * Description:计数同步类，他可以让当前线程处于等待状态，直到计数为0时才能继续往下执行。
 * 同步的原因：内部维护着一个 Sync 类，该内部类继承了同步阻塞队列。
 * CountDownLatch 可以说是只是一个包装，他的所有方法都是通过调用 Sync 方法来解决的，而 Sync 方法的运算操作都是基于 CAS 机制。
 */
public class CountDownLatchTest {
    static CountDownLatch count = new CountDownLatch(2);
    static int sum1 = 0; // 1 到 100 相加
    static int sum2 = 0; // 101 到 200 相加

    public static void main(String[] args) {
        // 线程 1
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 执行 1 到 10 相加
                for (int i = 1; i <= 100; i++) {
                    sum1 += i;
                }
                count.countDown();
            }
        }).start();
        // 线程2
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 执行 101 到 200 相加
                for (int i = 101; i <= 200; i++) {
                    // 假设每次执行相加都会花一些时间
                    sum1 += i;
                }
                count.countDown();
            }
        }).start();

        // 等到两个线程都执行完，在把他们相加
        try {
            count.wait();
            System.out.println("最终的结果：" + (sum1 + sum2));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}